package com.hualan.sfzyproject.service;


import com.hualan.sfzyproject.domain.ChatMessageDTO;
import com.hualan.sfzyproject.domain.ChatMessage;
import com.hualan.sfzyproject.handler.ChatWebSocketHandler;
import com.hualan.sfzyproject.mapper.ChatMessageMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;
import java.util.stream.Collectors;

@Service
@Slf4j
public class ChatService {

    @Autowired
    private ChatMessageMapper chatMessageMapper;

    /**
     * 保存聊天消息到数据库
     *
     * @param message 包含聊天消息的Map，包括senderId、senderName、senderAvatar、receiverId、content和timestamp字段
     */
    public void saveMessage(Map<String, Object> message) {
        try {
            // 1. 记录日志
            log.info("收到消息: {}", message);

            // 2. 保存消息到数据库
            ChatMessage chatMessage = new ChatMessage();
            chatMessage.setSenderId(getStringValue(message, "senderId"));
            chatMessage.setSenderName(getStringValue(message, "senderName", "用户"));
            chatMessage.setSenderAvatar(getStringValue(message, "senderAvatar", ""));
            chatMessage.setReceiverId(getStringValue(message, "receiverId"));
            chatMessage.setContent(getStringValue(message, "content"));
            chatMessage.setTimestamp(getLongValue(message, "timestamp"));
            
            // 直接使用消息中的 type 字段
            chatMessage.setType(getStringValue(message, "type", "vue"));  // 默认为 vue 类型

            chatMessageMapper.insert(chatMessage);

        } catch (Exception e) {
            log.error("保存消息失败: {}", e.getMessage());
        }
    }

    /**
     * 获取咨询师的聊天列表（按发送者分组）
     *
     * @param consultantId 咨询师ID
     * @return 咨询师的聊天列表，每个聊天项包括发送者ID、名称、头像、最后一条消息和时间戳
     */
    public List<ChatMessageDTO> getConsultantChatList(String consultantId) {
        try {
            // 获取咨询师的最新消息列表（每个发送者的最新一条消息）
            List<ChatMessage> messages = chatMessageMapper.findLatestMessagesByTeacherId(consultantId);

            // 转换为DTO
            return messages.stream()
                    .map(msg -> {
                        ChatMessageDTO dto = new ChatMessageDTO();
                        dto.setId(msg.getSenderId());  // 使用发送者ID作为聊天项的ID
                        dto.setName(msg.getSenderName() != null ? msg.getSenderName() : "用户" + msg.getSenderId());
                        dto.setAvatar(msg.getSenderAvatar());
                        dto.setLastMessage(msg.getContent());
                        dto.setTimestamp(msg.getTimestamp());
                        dto.setSenderId(msg.getSenderId());
                        dto.setSenderName(msg.getSenderName());
                        return dto;
                    })
                    .collect(Collectors.toList());

        } catch (Exception e) {
            log.error("获取咨询师聊天列表失败: {}", e.getMessage());
            return new ArrayList<>();
        }
    }

    /**
     * 获取与特定用户的聊天历史记录
     *
     * @param consultantId 咨询师ID
     * @param userId 用户ID
     * @return 聊天历史记录列表，包括消息ID、内容、时间戳和发送者信息
     */
    public List<ChatMessageDTO> getChatHistory(String consultantId, String userId) {
        // 获取聊天历史记录
        List<ChatMessage> messages = chatMessageMapper.findBySenderIdOrReceiverId(userId, consultantId);

        // 转换为 DTO
        return messages.stream()
            .map(msg -> {
                ChatMessageDTO dto = new ChatMessageDTO();
                dto.setId(String.valueOf(msg.getId()));
                dto.setContent(msg.getContent());
                dto.setTimestamp(msg.getTimestamp());

                // 设置发送者信息
                if (msg.getSenderId().equals(consultantId)) {
                    // 如果发送者是咨询师
                    dto.setSenderId(consultantId);
                    dto.setSenderName("咨询师");  // 可以从数据库获取咨询师名称
                } else {
                    // 如果发送者是用户
                    dto.setSenderId(msg.getSenderId());
                    dto.setSenderName("用户");  // 可以从数据库获取用户名称
                }

                return dto;
            })
            .collect(Collectors.toList());
    }

    /**
     * 从Map中获取String类型的值
     *
     * @param map 包含键值对的Map
     * @param key 需要获取的键
     * @return 键对应的String值，如果键不存在则抛出IllegalArgumentException
     */
    private String getStringValue(Map<String, Object> map, String key) {
        Object value = map.get(key);
        if (value == null) {
            throw new IllegalArgumentException("Required field missing: " + key);
        }
        return value.toString();
    }

    /**
     * 从Map中获取String类型的值，如果键不存在则返回默认值
     *
     * @param map 包含键值对的Map
     * @param key 需要获取的键
     * @param defaultValue 默认值
     * @return 键对应的String值或默认值，如果键不存在则返回默认值
     */
    private String getStringValue(Map<String, Object> map, String key, String defaultValue) {
        Object value = map.get(key);
        return value != null ? value.toString() : defaultValue;
    }

    /**
     * 从Map中获取Long类型的值，如果键不存在则返回当前时间戳
     *
     * @param map 包含键值对的Map
     * @param key 需要获取的键
     * @return 键对应的Long值或当前时间戳，如果键不存在则返回当前时间戳
     */
    private Long getLongValue(Map<String, Object> map, String key) {
        Object value = map.get(key);
        if (value == null) {
            return System.currentTimeMillis();
        }
        return value instanceof Long ? (Long) value : Long.parseLong(value.toString());
    }
}
